/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package quienesquien;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author warzo
 */
public class Game {
    public Statement s; //Esto se usa para las peticiones Mysql
    private User[] P; //Usuario que juega como P1 y P2
    private Persona[] EleccionP; //Eleccion de pj por P1 y P2
    private int Turno; //Turno actual de la partida
    private int Estado; //Diagrama de estado de la partida
    /**
     * Estado:
     * 0-> Pregunta P1
     * 1-> Responde P2
     * 2-> Descarta P1
     * 3-> Pregunta P2
     * 4-> Responde P1
     * 5-> Descarta P2
    */
    private Persona[][] Tablero; //Tablero del ¿Quien es Quien?
    public Boolean[][] DescartadosP1; //pj tumbaP1dos por P1
    public Boolean[][] DescartadosP2; //pj tumbado por P2
    private int[]NoDescartados;//Numero de casillas sin descartar
    private String[] Preguntas; //Array[2] con las preguntas + respuesta de cada uno
    private String[] LastPreg;//array que guarda la ultima pregunta efectuada
   
    //contructor de partidas
    public Game(User P1, User P2){

        //Inicializamos jugadores
        P=new User[2];
        P[0] = P1;
        P[1] = P2;

        //Creamos el tablero
        Tablero = new Persona[4][6];

        //inicializamos el tablero
        initTablero();

        //Se selecciona de forma aleatoria el Pj elejido
        EleccionP=new Persona[2];
        EleccionP[0]=seleccionPj();
        EleccionP[1]=seleccionPj();

        //Se inicializa turno
        Turno=0;

        //Inicializamos el estado de la partida
        Estado=0;

        //Se inicializan los descartados
        DescartadosP1=new Boolean[4][6];
        DescartadosP2=new Boolean[4][6];
        for(int x=0;x<4;x++){
             for(int y=0;y<6;y++){
                 DescartadosP1[x][y]=false;
                 DescartadosP2[x][y]=false;
             }
        }
        NoDescartados=new int[2];
        NoDescartados[0]=24;
        NoDescartados[1]=24;
        //Se inicializan las preguntas
        Preguntas=new String[2];
        Preguntas[0]="";
        Preguntas[1]="";
        LastPreg=new String[2];
        LastPreg[0]="";
        LastPreg[1]="";
        
    }

    /**
     * Esta funcion es llamada cuando solo queda 1 usuario por descartar,
     * devuelve la persona que el Player dice que es el elegido
     * @param player
     * @return
     */
    public Persona getEleccionFinal(int player) {
        for(int x=0;x<4;x++){
             for(int y=0;y<6;y++){
                 if (player==0){
                    if(DescartadosP1[x][y]==false)return Tablero[x][y];
                 }else{
                   if(DescartadosP2[x][y]==false)return Tablero[x][y];
                 }
             }
        }
        return null;
        
    }
    

    private void initTablero() {
       // int idP1=P1.getid(),idP2=P2.getid();//Obtenemos los id de los usuarios TODO grupos
        //String consulta = "SELECT * FROM `personas` WHERE 1 ORDER BY RAND() LIMIT 24";
        //TODO cambiar esta consulta por la gestion de grupos
        String consulta = "SELECT DISTINCT P.id,P.uid,P.nm,P.sn,P.mail1,P.mail2 FROM `personas` AS P, group_per AS GP WHERE P.id IN (Select id_persona from group_per where 1) ORDER BY RAND() LIMIT 24";

        ResultSet res;
        try {  try {
                s = crearStatement();
            } catch (SQLException ex) {
                Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
            } } catch (ClassNotFoundException ex) {     Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
            }
        try {        
            res = s.executeQuery(consulta);
            for(int x=0;x<4;x++){
             for(int y=0;y<6;y++){
                 res.next();
                 Tablero[x][y]=new Persona(res.getString("nm"), res.getString("sn"), res.getString("uid"));
             }
        }
            
            
        } catch (SQLException ex) {
            Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
        }
            
    }

    //selecciona de forma aleatoria un Pj para jugar
    private Persona seleccionPj() {
        return Tablero[(int) (Math.random() * 4)][(int) (Math.random() * 6)];
    }
    
    //Consultas sobre la tabla
     public String getUid(int x, int y) {
        return Tablero[x][y].getUid();
    }
       public String getNombre(int x, int y) { 
        return Tablero[x][y].getNombre();
    }
        public String getApellidos(int x, int y) {
        return Tablero[x][y].getApellidos();
    }
       public String getSelectPUid(int player){
           return EleccionP[player].getUid();
       }
        public String getSelectPNm(int player){
           return EleccionP[player].getNombre();
       }

        /*
         * Devuelve la persona oculta del player
         */
    public Persona getEleccionP(int player){
           return EleccionP[player];
       }
    //Es bob el elejido por el player?
    public boolean isBob(Persona bob,int player){
        if(player==0){
            return (EleccionP[0] == bob);
        }else{
            return (EleccionP[1] == bob);
        }
    }

    //Devuelve el numero de turno actual
    public int getTurno(){
        return Turno;
    }

    //Incrementa el numero de turno(un turno es una pregunta de P1 y una P2)
    public void incTurno(){
        Turno++;
    }

       //Añade la pregunta al log de preguntas
    public void setPregunta(String pregunta,int player){
        if(player==0){
            LastPreg[0]=pregunta;
        }else{
            LastPreg[1]=pregunta;
        }
    }
    
    public String getLogPreguntas(int player){
        if(player==0){
            return Preguntas[0];
        }else{
            return Preguntas[1];
        }
    }
    public void incLogPreguntas(int player, String new_preg){
        if(player==0){
            Preguntas[0]="\n<p>"+new_preg+"</p>"+Preguntas[0];
        }else{
            Preguntas[1]="\n<p>"+new_preg+"</p>"+Preguntas[1];
        }
    }
    
    //Devuelve el log de preguntas en funcion del jugador
    public String getPregunta(int player){
        if(player==0){
            return LastPreg[0];
        }else{
            return LastPreg[1];
        }
    }

    //Marca una casilla del tablero como descartada
    public void descartaPj(int x, int y,int player){
        if(player==0){
            DescartadosP1[x][y]=true;
        }else{
            DescartadosP2[x][y]=true;
        }
        NoDescartados[player]--;
    }

    /*
     *Devuelve el numero de casillas descartadas
     */
    public int getNumNoDescartados(int player){
        return NoDescartados[player];
    }


    //consulta si una casilla ha sido descartada
    public boolean isDescarted(int x, int y,int player){
        if(player==0){
            return DescartadosP1[x][y];
        }else{
           return DescartadosP2[x][y];
        }
    }
    
    //incrementa el estado en 1 pero sin pasarse del 5
    public void incEstado(){
        Estado=(Estado+1)%6;
    }

    //Devuelve el estado de la partida
    public int getEstado(){
        return Estado;
    }
    
    public Statement crearStatement() throws SQLException, ClassNotFoundException {
        //Comprobamos que tenemos el driver de java mysql
        Class.forName("com.mysql.jdbc.Driver");
        // Establecemos la conexion con la base de datos.
        Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/quien_es_quien", "quien_es_quien", "quien_es_quien");
        // Preparamos la consulta
        return conexion.createStatement();
    }
    public String getPlayerNick(int player){
        return P[player].getnick();
    }
      public String getPlayerUid(int player){
        return P[player].getuid();
    }
        public int getPlayerId(int player){
        return P[player].getid();
    }
}
